package com.anjiebang.intercepter;

import com.anjiebang.utils.RedisUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * app拦截器
 * Created by laiyanlin on 2018/4/8.
 */
@Component
public class AppInterceptor implements HandlerInterceptor {

    @Resource
    private InterceptUtil interceptUtil;

    @Autowired
    private RedisUtils redisUtils;
    /**
     * 处理app接口请求参数
     * @param request 请求
     * @param httpServletResponse 响应
     * @param o 是指controller的@Controller注解下的整个方法名
     * @return 是否拦截
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse httpServletResponse, Object o) throws Exception {
        //在请求处理之前进行调用
        if (!interceptUtil.canPass(request, httpServletResponse)){
            return false;
        }

        //获取token、换取userId凭证
        String token = request.getHeader("token");
        //从redis中获取userID
        Integer userId = token==null?null:Integer.valueOf(String.valueOf(token));
        
        return true;
    }

    /**
     * //请求处理之后进行调用，但是在视图被渲染之前
     * @param httpServletRequest 请求
     * @param httpServletResponse 响应
     * @param o 是指controller的@Controller注解下的整个方法名
     * @return 是否拦截
     */
    @Override
    public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
        //请求处理之后进行调用，但是在视图被渲染之前
    }

    /**
     * 在整个请求结束之后被调用，也就是在DispatcherServlet 渲染了对应的视图之后执行（主要是用于进行资源清理工作）
     * @param httpServletRequest 请求
     * @param httpServletResponse 响应
     * @param o 是指controller的@Controller注解下的整个方法名
     * @return 是否拦截
     */
    @Override
    public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
        //在整个请求结束之后被调用，也就是在DispatcherServlet 渲染了对应的视图之后执行（主要是用于进行资源清理工作）
    }
}
